package main

import (
	"encoding/json"
	"log"
	"os"
)

//JSON的key可以为string类型或者整数类型或者任何实现encoding.TextMarshaler的类型。
//指针将被编码为它指向的值，如果是nil的话就编码为NULL。
//对于结构体类型，标准库中的json包只能处理导出的字段（大写开头的字段）。一些第三方的json包没有这个限制。
//
//bool对应boolean
//float64对应JSON的数字
//string对应JSON的字符串
//nil对应JSON的null

type Message struct {
	Name    string
	Age     int
	Parents []string
}

func demo_json() {

	b := []byte(`{"Name":"Bob", "Age":1, "Food":"Pickle"}`)
	var m Message
	//Unmarshal函数只会解码能匹配上的字段，其他的不会受到任何影响。
	// If the pointer is nil, Unmarshal allocates a new value for it to point to.
	err := json.Unmarshal(b, &m)
	if err == nil {
		log.Printf("%s\n", m)
	}

	sample := map[string]interface{}{
		"Name": "Wednesday",
		"Age":  6,
		"Parents": []string{
			"1",
			"2",
		},
	}
	b1, _ := json.Marshal(sample)
	log.Printf("%s\n", b1)

	var data map[string]interface{}
	json.Unmarshal(b1, &data)
	log.Println(data)

}

//输入 {"wangliqiu":"itomisaki"}
func coder_demo() {
	decoder := json.NewDecoder(os.Stdin)
	encoder := json.NewEncoder(os.Stdout)

	var kvs map[string]interface{}
	for {
		//os.Stdin will block by per loop
		err := decoder.Decode(&kvs)
		assertErr(err)

		err1 := encoder.Encode(&kvs)
		assertErr(err1)

		log.Println(kvs)
	}

}

func main() {

	//coder_demo()

	demo()

}

func assertErr(err error) {
	if err != nil {
		log.Fatal(err)
		panic(err)
	}
}
